(defun robots ()
  (loop named main
       with directions = '((q . -65) (w . -64) (e . -63) (a . -1)
			   (d . 1) (z . 63) (x . 64) (c . 65))
       for pos = 544
       then (progn (format t "~%qwe/asd/zxc to move, (t)eleport, (l)eave:")
		   (force-output)
		   (let* ((c (read))
			  (d (assoc c directions)))
		     (cond (d (+ pos (cdr d)))
			   ((eq 't c) (random 1024))
			   ((eq 'l c) (return-from main 'bye))
			   (t pos))))
       for monsters = (loop repeat 10
			   collect (random 1024))
     then (loop for mpos in monsters
	       collect (if (> (count mpos monsters) 1)
			   mpos
			   (cdar (sort (loop for (k . d) in directions
					    for new-mpos = (+ mpos d)
					    collect (cons (+ (abs (- (mod new-mpos 64)
								     (mod pos 64)))
							     (abs (- (ash new-mpos -6)
								     (ash pos -6))))
							  new-mpos))
				       '<
				       :key #'car))))
       when (loop for mpos in monsters
		 always (> (count mpos monsters) 1))
       return 'player-wins
       do (format t
		  "~%|~{~<|~%|~,65:;~A~>~}|"
		  (loop for p
		       below 1024
		       collect (cond ((member p monsters)
				      (cond ((= p pos) (return-from main 'player-loses))
					    ((> (count p monsters) 1) #\#)
					    (t #\A)))
				     ((= p pos)
				      #\@)
				     (t #\ ))))))
